package com.school.sports.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.school.sports.entity.FileInfo;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 文件信息服务接口
 */
public interface FileInfoService extends IService<FileInfo> {

    /**
     * 分页查询文件信息
     * @param currentPage 当前页码
     * @param pageSize 每页显示数量
     * @param fileInfo 查询条件
     * @return 分页结果
     */
    IPage<FileInfo> getPage(int currentPage, int pageSize, FileInfo fileInfo);

    /**
     * 上传文件
     * @param file 上传的文件
     * @param relatedType 关联类型
     * @param relatedId 关联ID
     * @param description 文件描述
     * @param uploadUserId 上传用户ID
     * @return 文件信息
     */
    FileInfo uploadFile(MultipartFile file, String relatedType, Long relatedId, String description, Long uploadUserId);

    /**
     * 批量上传文件
     * @param files 上传的文件列表
     * @param relatedType 关联类型
     * @param relatedId 关联ID
     * @param description 文件描述
     * @param uploadUserId 上传用户ID
     * @return 文件信息列表
     */
    List<FileInfo> uploadFiles(MultipartFile[] files, String relatedType, Long relatedId, String description, Long uploadUserId);

    /**
     * 下载文件
     * @param fileId 文件ID
     * @param response HTTP响应对象
     */
    void downloadFile(Long fileId, HttpServletResponse response);

    /**
     * 删除文件（物理删除）
     * @param fileId 文件ID
     * @return 删除结果
     */
    boolean deletePhysicalFile(Long fileId);

    /**
     * 获取文件预览URL
     * @param fileId 文件ID
     * @return 预览URL
     */
    String getPreviewUrl(Long fileId);

    /**
     * 根据MD5值检查文件是否已存在
     * @param fileMd5 MD5值
     * @return 文件信息（如果存在）
     */
    FileInfo checkFileExists(String fileMd5);

    /**
     * 根据关联信息获取文件列表
     * @param relatedType 关联类型
     * @param relatedId 关联ID
     * @return 文件列表
     */
    List<FileInfo> getFilesByRelatedInfo(String relatedType, Long relatedId);

    /**
     * 根据用户ID获取文件列表
     * @param uploadUserId 上传用户ID
     * @return 文件列表
     */
    List<FileInfo> getFilesByUserId(Long uploadUserId);

    /**
     * 获取用户文件总大小
     * @param uploadUserId 上传用户ID
     * @return 文件总大小（字节）
     */
    Long getUserTotalFileSize(Long uploadUserId);

    /**
     * 检查文件类型是否允许上传
     * @param file 文件对象
     * @return 是否允许上传
     */
    boolean isAllowedFileType(MultipartFile file);

    /**
     * 检查文件大小是否在限制范围内
     * @param file 文件对象
     * @return 是否在限制范围内
     */
    boolean isFileSizeAllowed(MultipartFile file);
}